<?php        
    require_once(dirname(__DIR__).
        DIRECTORY_SEPARATOR.
        "inc".
        DIRECTORY_SEPARATOR.
        "incFunctions.php"
    );
    
    use SharedPHP\TestSuite;
    
    ### Testataan käyttäjän luominen ja käyttäjän tietojen muokkaaminen
    ### ---------------------------------------------------------------
    
    $user1Passwd    = uniqid();
    $ses1           = null;
    $user1          = array(
        "email"         => time().".".uniqid()."@email.com",
        "timezoneid"    => null,
        "default_unit"  => "kg",
        "timeout_min"   => 60,
        "password"      => $user1Passwd,
        "password2"     => $user1Passwd
    );
        
    # Haetaan aikahyöhykkeet
    TestSuite::test("user-1.0",function() use (&$user1,&$user2){
        $result = _apiCall("TimeZone","getList");
        
        # Aseta aikahyöhykkeet käyttäjille
        if (!empty($result["data"])) {
            $user1["timezoneid"] = array_keys($result["data"])[0];
            $user2["timezoneid"] = array_keys($result["data"])[0];
        }
        
        return (bool)count($result["data"]);
    },true);
    
    # Luo käyttäjä rajapintaan
    TestSuite::test("user-1.1",function() use ($user1){
        $result = _apiCall("User","createUser",null,$user1);
        return $result["code"];
    },0);
    
    # Yritä luoda sama käyttäjä uudelleen
    TestSuite::test("user-1.2",function() use ($user1){
        $result = _apiCall("User","createUser",null,$user1);
        return array(
            "code"          => $result["code"],
            "reasonCode"    => $result["reasonCode"]
        );
    },array("code" => 30,"reasonCode" => 1000));
    
    # Kirjaa käyttäjä sisään
    TestSuite::test("user-1.3",function() use ($user1,&$ses1){
        $result = _apiCall("Login","doLogin",null,array(
            "email"     => $user1["email"],
            "password"  => $user1["password"]
        ));
        $ses1 = $result["data"];
        return $result["code"];
    },0);
    
    # Muokkaa käyttäjän etu- ja sukunimeä sekä salasanaa
    $user1Passwd        = uniqid();
    $user1["firstname"] = uniqid();
    $user1["lastname"]  = uniqid();
    $user1["password"]  = $user1["password2"] = $user1Passwd;
    
    TestSuite::test("user-1.4",function() use ($ses1,$user1){
        $result = _apiCall("User","save",$ses1,$user1);
        return $result["code"];
    },0);
    
    # Muokkaa salasanat siten että ne eivät täsmää toisiaan (virhe)
    TestSuite::test("user-1.5",function() use ($ses1,$user1){
        $user1["password2"] .= "1";
        $result = _apiCall("User","save",$ses1,$user1);
        return array(
            "code"          => $result["code"],
            "reasonCode"    => $result["reasonCode"]
        );
    },array("code" => 30,"reasonCode" => 1002));
    
    # Kirjaa käyttäjä ulos
    TestSuite::test("user-1.6",function() use ($ses1){
        $result = _apiCall("Login","doLogout",$ses1);
        return $result["code"];
    },0);
    
    # Kirjaa käyttäjä takaisin sisään
    TestSuite::test("user-1.7",function() use ($user1,&$ses1){
        $result = _apiCall("Login","doLogin",null,array(
            "email"     => $user1["email"],
            "password"  => $user1["password"]
        ));
        $ses1 = $result["data"];
        return $result["code"];
    },0);
    
    # Tarkasta käyttäjän tiedot
    $tmp = $user1;
    unset($tmp["password"]);
    unset($tmp["password2"]);
    TestSuite::test("user-1.8",function() use ($ses1){
        $result = _apiCall("User","load",$ses1);
        
        $tmp = $result["data"];
        unset($tmp["hashid"]);
        unset($tmp["updated"]);
        unset($tmp["rowstamp"]);
        
        return $tmp;
    },$tmp);
    
    # Päivitä kirjautuminen
    TestSuite::test("user-1.9",function() use ($ses1){
        $result = _apiCall("Login","refreshLogin",$ses1);
        return $result["data"];
    },true);
    
    # Kirjaa käyttäjä ulos
    TestSuite::test("user-1.10",function() use ($ses1){
        $result = _apiCall("Login","doLogout",$ses1);
        return $result["code"];
    },0);